x

Вложенные классы

  • Статические вложенные классы
  • Внутренние классы
  • Локальные классы
  • Анонимные классы

Статические вложенные классы

  • Доступ только к статическим полям внешнего класса
  • Не требует экземпляра внешнего класса
  • Логическая группировка классов
class Outer {
    static class Static { }
}
var object = new Outer.Static();

Внутренние классы

  • Доступ ко всем полям внешнего класса
  • Связаны с экземпляром внешнего класса
class Outer {
    private int field;
    class Inner {
        public int getOuterField() {
            return field;
        }
    }
}
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
print(inner.getOuterField());

Классы, вложенные в интерфейс

  • По умолчанию public static
public interface Vehicle {
    void start();

    class Engine {
        private int horsepower;
        public Engine(int horsepower) {
            this.horsepower = horsepower;
        }
        public void roar() {
            System.out.println("Roar");
        }
    }
}

Vehicle.Engine myEngine = new Vehicle.Engine(150);
myEngine.roar(); 

Локальные классы

  • Объявляются внутри метода
  • Видимость только внутри метода
  • Нет модификаторов
class Outer {
    void outerMethod() {
        class Local {
            void innerMethod() { }
        }
        Local local = new Local();
        local.innerMethod();
    }
}

Анонимные классы

  • Объявление и создание в одном выражении
  • Отсутствие имени класса
  • Реализация интерфейсов или наследование классов
interface I { void method(); }

I obj = new I() {
    @Override
    public void method() {
        print("Hello");
    }
};
obj.method();

Дополнительно: про вложенные интерфейсы

Left-click: follow link, Right-click: select node, Scroll: zoom
x